/*
 * 文件名称:          SpringHibernateJpaVendorAdapter.java
 * 版权所有@ 2016——2017 无锡聆音科技有限公司，保留所有权利
 * 时间:             2016年7月27日 下午9:21:11
 */
package com.lingyin.database.transaction.hibernate;

import java.util.HashMap;
import java.util.Map;

import org.hibernate.cfg.Environment;
import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;

/**
 *  Spring的jpa类有问题。主要是原有的类对数据库的方言是定义死了，只支持那几种数据库。
 * 该类修改为数据库的方言由配置方言的class来确定，这样对于新增加的数据库，就能够很好的支持。
 * 
 * @项目        hibernate.database.transaction
 * 
 * @作者:       关宏新
 * 
 * @日期:       2016年7月27日
 * 
 * @负责人:    关宏新
 * 
 * @负责小组:   聆音项目组
 * 
 */
public class SpringHibernateJpaVendorAdapter extends HibernateJpaVendorAdapter
{
    // 各个方言的实现类
    private String dialect;
    
    /**
     * 
     */
    public SpringHibernateJpaVendorAdapter()
    {
    }
    
    /**
     * 
     * @return 返回方言的实现类
     */
    public String getDialect()
    {
        return dialect;
    }

    /**
     * 设置方言的实现类
     * @param dialect 该参数为类名，包含包名
     */
    public void setDialect(String dialect)
    {
        this.dialect = dialect;
    }

    /**
     * 
     * @return 返回jpa的属性集合
     */
    public Map<String, Object> getJpaPropertyMap()
    {
        Map<String, Object> jpaProperties = new HashMap<String, Object>();

        if (getDatabasePlatform() != null)
        {
            jpaProperties.put(Environment.DIALECT, getDatabasePlatform());
        }
        else if (getDatabase() != null)
        {
            Class<?> databaseDialectClass = determineDatabaseDialectClass(getDatabase());
            if (databaseDialectClass == null)
            {
                databaseDialectClass = determineDatabaseDialectClassByDialect();
            }
            if (databaseDialectClass != null)
            {
                jpaProperties.put(Environment.DIALECT,  databaseDialectClass.getName());
            }
        }
        if (isGenerateDdl())
        {
            jpaProperties.put(Environment.HBM2DDL_AUTO, "update");
        }
        if (isShowSql())
        {
            jpaProperties.put(Environment.SHOW_SQL, "true");
        }

        return jpaProperties;
    }
    
    /** 通过方言类之间获取class定义
     */
    private Class<?> determineDatabaseDialectClassByDialect()
    {
        if (dialect != null)
        {
            try
            {
                return Class.forName(dialect);
            }
            catch(Exception e)
            {
                e.printStackTrace();
            }
        }
        return null;
    }

}
